Reproducing the figures of the manuscript

Load libraries

library(qs)
library(Seurat)
library(tidyverse)
library(miloDE)
library(sessioninfo)
library(EnhancedVolcano)
library(pals)
library(scMisc)

Figure 1

UMAP of all cells (Figure 1B)

options(timeout = 3600)
if (!file.exists("umap_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "umap_figure.qs"
    )
}
umap_figure <- qread("umap_figure.qs")
DimPlot(
    umap_figure,
    reduction = "umap.scvi.full",
    pt.size = .1,
    alpha = .1,
    cols = umap_figure@misc$cluster_col,
    label = TRUE,
    raster = FALSE
) +
    NoLegend() +
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank()
    ) +
    xlab("UMAP_1") +
    ylab("UMAP_2")

Figure 2

UMAP immune cells (Figure 2A)

options(timeout = 3600)
if (!file.exists("ic_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "ic_figure.qs"
    )
}
ic_figure <- qread("ic_figure.qs")
DimPlot(
    ic_figure,
    reduction = "umap.rpca",
    pt.size = .1,
    alpha = .3,
    cols = ic_figure@misc$ic_cluster_col,
    label = TRUE,
    raster = FALSE
) +
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank()
    ) +
    NoLegend() +
    xlab("UMAP1") +
    ylab("UMAP2")

Feature plots immune cells (Figure 2B)

FeaturePlot(
    ic_figure,
    features = c("MS4A7", "CX3CR1", "TREM2", "LYVE1", "FOLR2", "TIMD4"),
    reduction = "umap.rpca",
    pt.size = 0.1,
    raster = FALSE,
    coord.fixed = TRUE,
    cols = c("#F0F0F0", "#CB181D"),
    order = TRUE,
    ncol = 3
) &
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank()
    ) &
    xlab("UMAP1") &
    ylab("UMAP2")

Enrichment of gene ontology terms in Macro 18 (Figure 2C)

options(timeout = 3600)
if (!file.exists("enrichr_macro18.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "b_plasma_figure.qs"
    )
}
enrichr_macro18 <- qread("enrichr_macro18.qs")
enrichr_macro18 |>
    dplyr::slice_min(order_by = Adjusted.P.value, n = 10, with_ties = FALSE) |>
    tidyr::separate(Overlap, into = c("overlap1", "overlap2")) |> # separate overlap in two columns
    dplyr::mutate(Term = gsub(x = Term, pattern = "\\s\\(.+\\)", replacement = "")) |>
    dplyr::mutate(overlap = as.numeric(overlap1) / as.numeric(overlap2)) |> # calculcate overlap
    ggplot(aes(y = reorder(Term, -log10(Adjusted.P.value)), x = -log10(Adjusted.P.value))) +
    geom_col(fill = scales::hue_pal()(5)[1]) +
    labs(
        x = "-Log10 Adjusted P value",
        y = ""
    ) +
    theme_classic() +
    theme(legend.position = "none")

Dot plot IGH chain genes (Figure 2E)

options(timeout = 3600)
if (!file.exists("ic_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "b_plasma_figure.qs"
    )
}
b_plasma_figure <- qread("b_plasma_figure.qs")
DotPlot(
    b_plasma_figure,
    features = c("IGHM", "IGHD", "IGHG1", "IGHG2", "IGHG3", "IGHG4", "IGHA1", "IGHA2"),
    scale = FALSE,
    dot.scale = 10
) +
    viridis::scale_color_viridis(option = "viridis") +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, face = "italic")) +
    xlab("") +
    ylab("")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Figure 3

Propeller abundance PNP vs CTRL (Figure 3A)

options(timeout = 3600)
if (!file.exists("propeller_PNP_CTRL.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "propeller_PNP_CTRL.qs"
    )
}
if (!file.exists("propeller_PNP_CTRL.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "propeller_PNP_CTRL_ic.qs"
    )
}
propeller_PNP_CTRL <- qread("propeller_PNP_CTRL.qs")
propeller_PNP_CTRL_ic <- qread("propeller_PNP_CTRL_ic.qs")

# function to plot custom dotplot
dotplotPropeller <- function(data, color, title) {
    ggplot(data, aes(x = log2ratio, y = fct_reorder(cluster, log2ratio), color = cluster)) +
        geom_point(size = 5) +
        theme_classic() +
        geom_vline(
            xintercept = 0, color = "red",
            linetype = "solid"
        ) +
        scale_color_manual(values = color) +
        xlab("Log2 fold change") +
        ylab(NULL) +
        theme(legend.position = "none") + 
        ggtitle(title)
}
dotplotPropeller(propeller_PNP_CTRL, color = umap_figure@misc$cluster_col, title = "PNP vs CTRL main clusters")

dotplotPropeller(propeller_PNP_CTRL_ic, color = ic_figure@misc$ic_cluster_col, title = "PNP vs CTRL immune cells")

Covarying Neighborhood Analysis (Figure 3B)

options(timeout = 3600)
if (!file.exists("cna_pnp_gratio_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "cna_pnp_gratio_figure.qs"
    )
}
if (!file.exists("cna_incat_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "cna_incat_figure.qs"
    )
}
cna_pnp_gratio_figure <- qread("cna_pnp_gratio_figure.qs")
cna_incat_figure <- qread("cna_incat_figure.qs")

# function to plot CNA feature plot
fplotCNA <-  function(object, feature, title) {
    FeaturePlot(
        object,
        reduction = "umap.scvi.full",
        features = feature,
        pt.size = 0.1,
        order = FALSE,
        coord.fixed = TRUE,
        raster = FALSE,
        alpha = 0.2
    ) +
    scale_colour_gradient2(
        low = "#2166AC",
        mid = "white",
        high = "#B2182B",
        midpoint = 0,
    ) +
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank(),
    ) +
    labs(
        title = title, color = "Correlation", x = "UMAP1", y= "UMAP2"
    )
}

fplotCNA(cna_pnp_gratio_figure, "cna_ncorrs_pnp", title = "PNP")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

fplotCNA(cna_incat_figure, "cna_ncorrs", title = "INCAT")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

fplotCNA(cna_pnp_gratio_figure, "cna_ncorrs_gratio", title = "g-ratio")
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Number of DEGs (Figure 3C)

options(timeout = 3600)
if (!file.exists("pnp_ctrl_pseudobulk_de.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "pnp_ctrl_pseudobulk_de.qs"
    )
}
pnp_ctrl_pseudobulk <- qread("pnp_ctrl_pseudobulk_de.qs")
pnp_ctrl_pseudobulk |>
    mutate(cluster = fct_reorder(cluster, n)) |>
    ggplot(aes(x = cluster, y = n, fill = cluster)) +
    geom_col() +
    coord_flip() +
    scale_fill_manual(values = umap_figure@misc$cluster_col) +
    theme_classic() +
    theme(legend.position = "none") +
    labs(
        x = "",
        y = "",
        title = "PNP vs CTRL"
    )

MiloDE DEGs PNP vs CTRL (Figure 3D)

options(timeout = 3600)
if (!file.exists("milo_figure.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "milo_figure.qs"
    )
}

milo_figure <- qread("milo_figure.qs")
plotMiloDE <- function(condition, title) {
    plot <- 
    plot_milo_by_single_metric(
        milo_figure$obj,
        milo_figure$stat[[condition]],
        colour_by = "n_DE_genes",
        layout = "UMAP.SCVI.FULL",
        size_range = c(0.5, 5),
        edge_width = c(0.1, 1.0),
        edge_weight.thres = 10
    ) +
    viridis::scale_fill_viridis(name = "# DE genes", option = "inferno") +
    ggtitle(title)
    print(plot)
}

plotMiloDE("pnp", "PNP vs CTRL")
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.

Pseudobulk DE PNP vs CTRL (Figure 3E)

options(timeout = 3600)
if (!file.exists("de_pseudo_pnp_ctrl.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "de_pseudo_pnp_ctrl.qs"
    )
}
de_pseudo_pnp_ctrl <- qread("de_pseudo_pnp_ctrl.qs")

# volcano plot function
volcanoPlot <- function(cluster, input, FCcutoff = 2, selectLab = NULL, drawConnectors = TRUE, condition1, condition2) {
    input <- input[[cluster]]
    volcano <- EnhancedVolcano::EnhancedVolcano(
        data.frame(input),
        lab = paste0("italic('", input[["gene"]], "')"),
        x = "avg_logFC",
        y = "p_val_adj",
        xlim = c(min(input[["avg_logFC"]], max(input[["avg_logFC"]]))),
        ylim = c(0, max(-log10(input[["p_val_adj"]]))),
        pCutoff = 0.1,
        FCcutoff = FCcutoff,
        axisLabSize = 15,
        pointSize = 2,
        labSize = 5,
        subtitle = NULL,
        caption = NULL,
        border = "full",
        gridlines.major = FALSE,
        gridlines.minor = FALSE,
        drawConnectors = drawConnectors,
        lengthConnectors = unit(0.0001, "npc"),
        title = paste(condition1, "vs", condition2, "in ", cluster),
        boxedLabels = TRUE,
        selectLab = selectLab,
        xlab = bquote(~ Log[2] ~ "fold change"),
        ylab = bquote(~ -Log[10] ~ "adjusted p-value"),
        parseLabels = TRUE,
        legendLabels = c(
            "NS", "logFC",
            "p-val", "p-val + logFC"
        ),
        legendPosition = "right",
    )
}

# define clusters of interest
cluster_de <- c("mySC", "nmSC", "repairSC", "PC2")

# define genes of interests
lab_pnp_ctrl <- list(
    "mySC" = paste0("italic('", c("DCN", "TNXB", "COL1A1", "COL15A1", "CD53", "IL4R", "CD74"), "')"),
    "nmSC" = paste0("italic('", c("IL10RA", "IL13RA1", "CSF2RA", "TGFBI"), "')"),
    "repairSC" = paste0("italic('", c("GALR1", "TMEM47"), "')"),
    "PC2" = paste0("italic('", c("MFAP5", "NLGN4Y", "PCDH11Y", "IFIT3", "OASL", "MX1"), "')")
)

# plot volcano plots of selected clusters
purrr::walk(
    cluster_de,
    function(cluster) {
        print(volcanoPlot(
            cluster = cluster,
            input = de_pseudo_pnp_ctrl,
            FCcutoff = 2,
            condition1 = "PNP",
            condition2 = "CTRL",
            selectLab = lab_pnp_ctrl[[cluster]]
        ))
    }
)

Figure 4

Abundance of clusters per PNP subtype (Figure 4A)

options(timeout = 3600)
if (!file.exists("abundance_main_clusters.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "abundanance_main_clusters.qs"
    )
}
abundance_main_clusters <- qread("abundance_main_clusters.qs")

abundance_main_clusters |>
    ggplot() +
    geom_col(
        aes(x = type, y = count, fill = cell),
        color = "black",
        linewidth = 0.1,
        position = "fill"
    ) +
    scale_fill_manual(values = umap_figure@misc$cluster_col) +
    guides(fill = guide_legend(title = NULL)) +
    theme_classic() +
    ylab("Proportion of cells") +
    xlab("") +
    theme(axis.text.x = element_text(
        angle = 90,
        hjust = 1, vjust = 0.3
    ))

Propeller abundance of PNP subtypes main cluster (Figure 4B)

options(timeout = 3600)
if (!file.exists("propeller_PNP_subtypes_main.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "propeller_PNP_subtypes_main.qs"
    )
}

propeller_PNP_subtypes_main <- qread("propeller_PNP_subtypes_main.qs")
purrr::walk(
    c("VN", "CIDP", "CIAP"),
    function(condition) {
        print(dotplotPropeller(
            propeller_PNP_subtypes_main[[condition]],
            color = umap_figure@misc$cluster_col,
            title = paste0("CTRL vs ", condition, " main")
        ))
    }
)

Propeller abundance of PNP subtypes immune cluster (Figure 4C)

options(timeout = 3600)
if (!file.exists("propeller_PNP_subtypes_ic.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "propeller_PNP_subtypes_ic.qs"
    )
}
propeller_PNP_subtypes_ic <- qread("propeller_PNP_subtypes_ic.qs")
purrr::walk(
    c("VN", "CIDP", "CIAP"),
    function(condition) {
        print(dotplotPropeller(
            propeller_PNP_subtypes_ic[[condition]],
            color = umap_figure@misc$cluster_col,
            title = paste0("CTRL vs ", condition, " immune")
        ))
    }
)

Manual PTPRC quantif (Figure 4F)

options(timeout = 3600)
if (!file.exists("manual_xenium_quantification.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "manual_xenium_quantification.qs"
    )
}

manual_xenium_quantification <- qread("manual_xenium_quantification.qs")
plotQuanti <- function(y_value, title) {
    plot <- 
    manual_xenium_quantification |>
        ggplot(aes(x = level2, y = .data[[y_value]], fill = level2)) +
        geom_boxplot() +
        geom_jitter(height = 0, width = 0.1) +
        scale_fill_manual(values = umap_figure@misc$level2_cols) +
        guides(fill = guide_legend(title = NULL)) +
        theme_classic() +
        xlab("") +
        ylab("PTPRC density") +
        ggtitle(title) +
        theme(
            legend.position = "none",
            axis.text.x = element_text(
                angle = 90,
                hjust = 1,
                vjust = 0.3,
            )
        )
        print(plot)
}

purrr::walk2(
    c("endoPTPRC_density_sum", "epiPTPRC_density"),
    c("endoneurial", "epineurial"),  
    function(y_value, title) {
        plotQuanti(y_value = y_value, title = title)
    }
)

MiloDE DEGs PNP subtypes(Figure 4G)

purrr::walk2(
    c("vn", "cidp", "ciap"),
    c("VN vs CTRL", "CIDP vs CTRL", "CIAP vs CTRL"),
    function(condition, title) {
        plotMiloDE(condition, title)
    }
)
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.
Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.

Scale for fill is already present.
Adding another scale for fill, which will replace the existing scale.

Supplementary Figure 1

Demographics plot (Figure S1A)

options(timeout = 3600)
if (!file.exists("demographics.qs")) {
    download.file(
        "https://zenodo.org/records/14226219/files/umap_figure.qs?download=1",
        "demographics.qs"
    )
}

demographics <- qread("demographics.qs")

plotDemographics <- function(var) {
    plot <- demographics |>
        dplyr::filter(!is.na(.data[[var]])) |>
        ggplot(aes(x = level2, y = .data[[var]], fill = level2)) +
        geom_boxplot() +
        geom_point() +
        theme_bw() +
        scale_fill_manual(values = umap_figure@misc$level2_cols) +
        xlab("") +
        ylab("") +
        ggtitle(var) +
        theme(legend.position = "none")
    print(plot)
}

purrr::walk(c("age", "ncv_tibial_motoric", "incat"), plotDemographics)

demographics |>
    ggplot(aes(x = level2, fill = sex)) +
    geom_bar() + 
    theme_bw() +
    scale_fill_manual(values = pals::cols25(2)) +
    xlab("") +
    ylab("") +
    ggtitle("sex")

UMAP grouped by center and sample (Figure S1C)

DimPlot(
    umap_figure,
    reduction = "umap.scvi.full",
    pt.size = .1,
    raster = FALSE,
    alpha = 0.1,
    group.by = "center",
    cols = pals::cols25(3),
    label = FALSE
) +
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank()
    ) +
    xlab("UMAP_1") +
    ylab("UMAP_2")

my_cols_50 <- unname(Polychrome::createPalette(50, pals::cols25()))

DimPlot(
    umap_figure,
    reduction = "umap.scvi.full",
    pt.size = .1,
    raster = FALSE,
    alpha = 0.1,
    group.by = "sample",
    cols = umap_figure@misc$sample_cols,
    label = FALSE
) +
    theme(
        axis.text = element_blank(),
        axis.ticks = element_blank()
    ) +
    xlab("UMAP_1") +
    ylab("UMAP_2")

Number of genes per nucleus (Figure S1D)

count_genes <- dplyr::tibble(
    feature = umap_figure@meta.data$nFeature_RNA,
    sample = umap_figure@meta.data$sample
)

count_genes |>
    ggplot(aes(x = sample, y = feature, fill = sample)) +
    geom_boxplot() +
    scale_fill_manual(values = umap_figure@misc$sample_cols) +
    theme_classic() +
    theme(legend.position = "none") +
    xlab("") +
    ylab("") +
    ggtitle("Number of genes per nucleus") +
    theme(axis.text.x = element_text(angle = 90))

Session info

session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.3.1 (2023-06-16)
 os       Ubuntu 22.04.5 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  C.UTF-8
 ctype    C.UTF-8
 tz       UTC
 date     2024-12-21
 pandoc   2.19.2 @ /usr/local/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package              * version    date (UTC) lib source
 abind                  1.4-5      2016-07-21 [1] RSPM (R 4.3.0)
 Augur                  1.0.3      2024-12-20 [1] Github (neurorestore/Augur@fa5d837)
 backports              1.4.1      2021-12-13 [1] RSPM (R 4.3.0)
 beachmat               2.18.0     2023-10-24 [1] Bioconductor
 beeswarm               0.4.0      2021-06-01 [1] RSPM (R 4.3.0)
 Biobase                2.62.0     2023-10-24 [1] Bioconductor
 BiocGenerics           0.48.1     2023-11-01 [1] Bioconductor
 BiocNeighbors          1.20.2     2024-01-07 [1] Bioconductor 3.18 (R 4.3.1)
 BiocParallel           1.36.0     2023-10-24 [1] Bioconductor
 BiocSingular           1.18.0     2023-10-24 [1] Bioconductor
 bitops                 1.0-7      2021-04-24 [1] RSPM (R 4.3.0)
 broom                  1.0.5      2023-06-09 [1] RSPM (R 4.3.0)
 car                    3.1-2      2023-03-30 [1] RSPM (R 4.3.0)
 carData                3.0-5      2022-01-06 [1] RSPM (R 4.3.0)
 class                  7.3-22     2023-05-03 [1] CRAN (R 4.3.1)
 cli                    3.6.2      2023-12-11 [1] RSPM (R 4.3.0)
 cluster                2.1.6      2023-12-01 [1] RSPM (R 4.3.0)
 codetools              0.2-19     2023-02-01 [1] CRAN (R 4.3.1)
 colorspace             2.1-0      2023-01-23 [1] RSPM (R 4.3.0)
 cowplot                1.1.2      2023-12-15 [1] RSPM (R 4.3.0)
 crayon                 1.5.2      2022-09-29 [1] RSPM (R 4.3.0)
 data.table             1.14.10    2023-12-08 [1] RSPM (R 4.3.0)
 DelayedArray           0.28.0     2023-10-24 [1] Bioconductor
 DelayedMatrixStats     1.24.0     2023-10-24 [1] Bioconductor
 deldir                 2.0-2      2023-11-23 [1] RSPM (R 4.3.0)
 dichromat              2.0-0.1    2022-05-02 [1] RSPM (R 4.3.0)
 digest                 0.6.34     2024-01-11 [1] RSPM (R 4.3.0)
 dotCall64              1.1-1      2023-11-28 [1] RSPM (R 4.3.0)
 dplyr                * 1.1.4      2023-11-17 [1] RSPM (R 4.3.0)
 edgeR                  4.0.7      2024-01-12 [1] Bioconductor 3.18 (R 4.3.1)
 ellipsis               0.3.2      2021-04-29 [1] RSPM (R 4.3.0)
 EnhancedVolcano      * 1.20.0     2023-10-24 [1] Bioconductor
 evaluate               0.23       2023-11-01 [1] RSPM (R 4.3.0)
 fansi                  1.0.6      2023-12-08 [1] RSPM (R 4.3.0)
 farver                 2.1.1      2022-07-06 [1] RSPM (R 4.3.0)
 fastDummies            1.7.3      2023-07-06 [1] RSPM (R 4.3.0)
 fastmap                1.1.1      2023-02-24 [1] RSPM (R 4.3.0)
 fitdistrplus           1.1-11     2023-04-25 [1] RSPM (R 4.3.0)
 forcats              * 1.0.0      2023-01-29 [1] RSPM (R 4.3.0)
 furrr                  0.3.1      2022-08-15 [1] RSPM (R 4.3.0)
 future                 1.33.1     2023-12-22 [1] RSPM (R 4.3.0)
 future.apply           1.11.1     2023-12-21 [1] RSPM (R 4.3.0)
 generics               0.1.3      2022-07-05 [1] RSPM (R 4.3.0)
 GenomeInfoDb           1.38.5     2023-12-28 [1] Bioconductor 3.18 (R 4.3.1)
 GenomeInfoDbData       1.2.11     2024-12-20 [1] Bioconductor
 GenomicRanges          1.54.1     2023-10-29 [1] Bioconductor
 ggbeeswarm             0.7.2      2023-04-29 [1] RSPM (R 4.3.0)
 ggforce                0.4.1      2022-10-04 [1] RSPM (R 4.3.0)
 ggplot2              * 3.5.1      2024-04-23 [1] RSPM (R 4.3.0)
 ggpubr                 0.6.0      2023-02-10 [1] RSPM (R 4.3.0)
 ggraph                 2.1.0      2022-10-09 [1] RSPM (R 4.3.0)
 ggrepel              * 0.9.5      2024-01-10 [1] RSPM (R 4.3.0)
 ggridges               0.5.5      2023-12-15 [1] RSPM (R 4.3.0)
 ggsignif               0.6.4      2022-10-13 [1] RSPM (R 4.3.0)
 globals                0.16.2     2022-11-21 [1] RSPM (R 4.3.0)
 glue                   1.7.0      2024-01-09 [1] RSPM (R 4.3.0)
 goftest                1.2-3      2021-10-07 [1] RSPM (R 4.3.0)
 gower                  1.0.1      2022-12-22 [1] RSPM (R 4.3.0)
 graphlayouts           1.0.2      2023-11-03 [1] RSPM (R 4.3.0)
 gridExtra              2.3        2017-09-09 [1] RSPM (R 4.3.0)
 gtable                 0.3.4      2023-08-21 [1] RSPM (R 4.3.0)
 gtools                 3.9.5      2023-11-20 [1] RSPM (R 4.3.0)
 hardhat                1.3.0      2023-03-30 [1] RSPM (R 4.3.0)
 hms                    1.1.3      2023-03-21 [1] RSPM (R 4.3.0)
 htmltools              0.5.7      2023-11-03 [1] RSPM (R 4.3.0)
 htmlwidgets            1.6.4      2023-12-06 [1] RSPM (R 4.3.0)
 httpuv                 1.6.13     2023-12-06 [1] RSPM (R 4.3.0)
 httr                   1.4.7      2023-08-15 [1] RSPM (R 4.3.0)
 ica                    1.0-3      2022-07-08 [1] RSPM (R 4.3.0)
 igraph                 1.6.0      2023-12-11 [1] RSPM (R 4.3.0)
 ipred                  0.9-14     2023-03-09 [1] RSPM (R 4.3.0)
 IRanges                2.36.0     2023-10-24 [1] Bioconductor
 irlba                  2.3.5.1    2022-10-03 [1] RSPM (R 4.3.0)
 jsonlite               1.8.8      2023-12-04 [1] RSPM (R 4.3.0)
 KernSmooth             2.23-22    2023-07-10 [1] RSPM (R 4.3.0)
 knitr                  1.45       2023-10-30 [1] RSPM (R 4.3.0)
 labeling               0.4.3      2023-08-29 [1] RSPM (R 4.3.0)
 later                  1.3.2      2023-12-06 [1] RSPM (R 4.3.0)
 lattice                0.22-5     2023-10-24 [1] RSPM (R 4.3.0)
 lava                   1.7.3      2023-11-04 [1] RSPM (R 4.3.0)
 lazyeval               0.2.2      2019-03-15 [1] RSPM (R 4.3.0)
 leiden                 0.4.3.1    2023-11-17 [1] RSPM (R 4.3.0)
 lifecycle              1.0.4      2023-11-07 [1] RSPM (R 4.3.0)
 limma                  3.58.1     2023-10-31 [1] Bioconductor
 listenv                0.9.0      2022-12-16 [1] RSPM (R 4.3.0)
 lmtest                 0.9-40     2022-03-21 [1] RSPM (R 4.3.0)
 locfit                 1.5-9.8    2023-06-11 [1] RSPM (R 4.3.0)
 lubridate            * 1.9.3      2023-09-27 [1] RSPM (R 4.3.0)
 magrittr               2.0.3      2022-03-30 [1] RSPM (R 4.3.0)
 mapproj                1.2.11     2023-01-12 [1] RSPM (R 4.3.0)
 maps                   3.4.2      2023-12-15 [1] RSPM (R 4.3.0)
 MASS                   7.3-60     2023-05-04 [1] CRAN (R 4.3.1)
 Matrix                 1.6-5      2024-01-11 [1] RSPM (R 4.3.0)
 MatrixGenerics         1.15.0     2024-12-20 [1] Github (Bioconductor/MatrixGenerics@ed066a2)
 matrixStats            1.2.0      2023-12-11 [1] RSPM (R 4.3.0)
 miloDE               * 0.0.0.9000 2024-12-20 [1] Github (MarioniLab/milODE@3f825b9)
 miloR                  1.10.0     2023-10-24 [1] Bioconductor
 mime                   0.12       2021-09-28 [1] RSPM (R 4.3.0)
 miniUI                 0.1.1.1    2018-05-18 [1] RSPM (R 4.3.0)
 munsell                0.5.0      2018-06-12 [1] RSPM (R 4.3.0)
 nlme                   3.1-164    2023-11-27 [1] RSPM (R 4.3.0)
 nnet                   7.3-19     2023-05-03 [1] CRAN (R 4.3.1)
 pals                 * 1.8        2023-08-23 [1] RSPM (R 4.3.0)
 parallelly             1.36.0     2023-05-26 [1] RSPM (R 4.3.0)
 parsnip                1.1.1      2023-08-17 [1] RSPM (R 4.3.0)
 patchwork              1.2.0      2024-01-08 [1] RSPM (R 4.3.0)
 pbapply                1.7-2      2023-06-27 [1] RSPM (R 4.3.0)
 pbmcapply              1.5.1      2022-04-28 [1] RSPM (R 4.3.0)
 pillar                 1.9.0      2023-03-22 [1] RSPM (R 4.3.0)
 pkgconfig              2.0.3      2019-09-22 [1] RSPM (R 4.3.0)
 plotly                 4.10.3     2023-10-21 [1] RSPM (R 4.3.0)
 plyr                   1.8.9      2023-10-02 [1] RSPM (R 4.3.0)
 png                    0.1-8      2022-11-29 [1] RSPM (R 4.3.0)
 polyclip               1.10-6     2023-09-27 [1] RSPM (R 4.3.0)
 prodlim                2023.08.28 2023-08-28 [1] RSPM (R 4.3.0)
 progressr              0.14.0     2023-08-10 [1] RSPM (R 4.3.0)
 promises               1.2.1      2023-08-10 [1] RSPM (R 4.3.0)
 purrr                * 1.0.2      2023-08-10 [1] RSPM (R 4.3.0)
 qs                   * 0.25.7     2023-12-06 [1] RSPM (R 4.3.0)
 R6                     2.5.1      2021-08-19 [1] RSPM (R 4.3.0)
 randomForest           4.7-1.1    2022-05-23 [1] RSPM (R 4.3.0)
 RANN                   2.6.1      2019-01-08 [1] RSPM (R 4.3.0)
 RApiSerialize          0.1.2      2022-08-25 [1] RSPM (R 4.3.0)
 RColorBrewer           1.1-3      2022-04-03 [1] RSPM (R 4.3.0)
 Rcpp                   1.0.12     2024-01-09 [1] RSPM (R 4.3.0)
 RcppAnnoy              0.0.21     2023-07-02 [1] RSPM (R 4.3.0)
 RcppGreedySetCover     0.1.0      2018-01-24 [1] RSPM (R 4.3.0)
 RcppHNSW               0.5.0      2023-09-19 [1] RSPM (R 4.3.0)
 RcppParallel           5.1.7      2023-02-27 [1] RSPM (R 4.3.0)
 RCurl                  1.98-1.14  2024-01-09 [1] RSPM (R 4.3.0)
 readr                * 2.1.5      2024-01-10 [1] RSPM (R 4.3.0)
 recipes                1.0.9      2023-12-13 [1] RSPM (R 4.3.0)
 reshape2               1.4.4      2020-04-09 [1] RSPM (R 4.3.0)
 reticulate             1.34.0     2023-10-12 [1] RSPM (R 4.3.0)
 rlang                  1.1.3      2024-01-10 [1] RSPM (R 4.3.0)
 rmarkdown              2.25       2023-09-18 [1] RSPM (R 4.3.0)
 ROCR                   1.0-11     2020-05-02 [1] RSPM (R 4.3.0)
 rpart                  4.1.23     2023-12-05 [1] RSPM (R 4.3.0)
 rsample                1.2.0      2023-08-23 [1] RSPM (R 4.3.0)
 RSpectra               0.16-1     2022-04-24 [1] RSPM (R 4.3.0)
 rstatix                0.7.2      2023-02-01 [1] RSPM (R 4.3.0)
 rsvd                   1.0.5      2021-04-16 [1] RSPM (R 4.3.0)
 Rtsne                  0.17       2023-12-07 [1] RSPM (R 4.3.0)
 S4Arrays               1.2.0      2023-10-24 [1] Bioconductor
 S4Vectors              0.40.2     2023-11-23 [1] Bioconductor 3.18 (R 4.3.1)
 ScaledMatrix           1.10.0     2023-10-24 [1] Bioconductor
 scales                 1.3.0      2023-11-28 [1] RSPM (R 4.3.0)
 scattermore            1.2        2023-06-12 [1] RSPM (R 4.3.0)
 scMisc               * 0.3.0      2024-12-20 [1] Github (mihem/scMisc@6b1e979)
 sctransform            0.4.1      2023-10-19 [1] RSPM (R 4.3.0)
 scuttle                1.12.0     2023-10-24 [1] Bioconductor
 sessioninfo          * 1.2.2      2021-12-06 [1] RSPM (R 4.3.0)
 Seurat               * 5.0.1      2024-12-20 [1] Github (fentouxungui/seurat@d2d8d60)
 SeuratObject         * 5.0.1      2023-11-17 [1] RSPM (R 4.3.0)
 shiny                  1.8.0      2023-11-17 [1] RSPM (R 4.3.0)
 SingleCellExperiment   1.24.0     2023-10-24 [1] Bioconductor
 sp                   * 2.1-2      2023-11-26 [1] RSPM (R 4.3.0)
 spam                   2.10-0     2023-10-23 [1] RSPM (R 4.3.0)
 SparseArray            1.2.3      2023-12-25 [1] Bioconductor 3.18 (R 4.3.1)
 sparseMatrixStats      1.13.4     2024-12-20 [1] Github (const-ae/sparseMatrixStats@4c6e814)
 spatstat.data          3.0-3      2023-10-24 [1] RSPM (R 4.3.0)
 spatstat.explore       3.2-5      2023-10-22 [1] RSPM (R 4.3.0)
 spatstat.geom          3.2-7      2023-10-20 [1] RSPM (R 4.3.0)
 spatstat.random        3.2-2      2023-11-29 [1] RSPM (R 4.3.0)
 spatstat.sparse        3.0-3      2023-10-24 [1] RSPM (R 4.3.0)
 spatstat.utils         3.0-4      2023-10-24 [1] RSPM (R 4.3.0)
 statmod                1.5.0      2023-01-06 [1] RSPM (R 4.3.0)
 stringfish             0.16.0     2023-11-28 [1] RSPM (R 4.3.0)
 stringi                1.8.3      2023-12-11 [1] RSPM (R 4.3.0)
 stringr              * 1.5.1      2023-11-14 [1] RSPM (R 4.3.0)
 SummarizedExperiment   1.32.0     2023-10-24 [1] Bioconductor
 survival               3.5-7      2023-08-14 [1] RSPM (R 4.3.0)
 tensor                 1.5        2012-05-05 [1] RSPM (R 4.3.0)
 tester                 0.1.7      2013-11-14 [1] RSPM (R 4.3.0)
 tibble               * 3.2.1      2023-03-20 [1] RSPM (R 4.3.0)
 tidygraph              1.3.0      2023-12-18 [1] RSPM (R 4.3.0)
 tidyr                * 1.3.0      2023-01-24 [1] RSPM (R 4.3.0)
 tidyselect             1.2.0      2022-10-10 [1] RSPM (R 4.3.0)
 tidyverse            * 2.0.0      2023-02-22 [1] RSPM (R 4.3.0)
 timechange             0.2.0      2023-01-11 [1] RSPM (R 4.3.0)
 timeDate               4032.109   2023-12-14 [1] RSPM (R 4.3.0)
 tweenr                 2.0.2      2022-09-06 [1] RSPM (R 4.3.0)
 tzdb                   0.4.0      2023-05-12 [1] RSPM (R 4.3.0)
 utf8                   1.2.4      2023-10-22 [1] RSPM (R 4.3.0)
 uwot                   0.1.16     2023-06-29 [1] RSPM (R 4.3.0)
 vctrs                  0.6.5      2023-12-01 [1] RSPM (R 4.3.0)
 vipor                  0.4.7      2023-12-18 [1] RSPM (R 4.3.0)
 viridis                0.6.4      2023-07-22 [1] RSPM (R 4.3.0)
 viridisLite            0.4.2      2023-05-02 [1] RSPM (R 4.3.0)
 withr                  2.5.2      2023-10-30 [1] RSPM (R 4.3.0)
 xfun                   0.41       2023-11-01 [1] RSPM (R 4.3.0)
 xtable                 1.8-4      2019-04-21 [1] RSPM (R 4.3.0)
 XVector                0.42.0     2023-10-24 [1] Bioconductor
 yaml                   2.3.8      2023-12-11 [1] RSPM (R 4.3.0)
 yardstick              1.2.0      2023-04-21 [1] RSPM (R 4.3.0)
 zlibbioc               1.48.0     2023-10-24 [1] Bioconductor
 zoo                    1.8-12     2023-04-13 [1] RSPM (R 4.3.0)

 [1] /opt/R/4.3.1/lib/R/library

──────────────────────────────────────────────────────────────────────────────